# global关键字使用示例

# def func_f():
#     print(a)
#     # a += 1# 若启用该语句，由于这里出现了赋值操作，所以在函数执行前的检索操作，
#             # 会将a当作局部变量进行处理，而由于a作为局部变量未被初始化，所以会报错
#
#     #a = 2 # 解释器可能会自动检验当权局部变量名是否与全局重名
# def func_s():
#     global a
#     a += 1
#
# a = 1
# func_f()
# print(a)# 1
#
# func_s()
# print(a)# 2


# 在函数内部定义函数示例
from typing import Callable

def func1() -> Callable[[], None]:
    num = 2
    print(f"func1()->{num}")
    def func2():
        nonlocal num
        num += 1
        print(f"func2()->{num}")
    return func2

func1()# func1()->2
# func2() 不能在外函数外部直接调用内部函数

function = func1()# func1()->2
function()# func1()->3 -》可以发现，尽管调用fun2时没有调用func1，
          # 也会将先开始调用func1时进行的初始化结果保存下来
function()# func1()->4

function_s = func1()# func1()->2-》并且，当再次调用func1函数时，func2中保存的值不会被重置
                    # 更确切的说，此时func1返回的func2与function中存储的是不同的对象
function()# func1()->5-》再次调用func1后，function的值没有被重置
function()# func1()->6
function_s()# func2()->3-》原因是function中的func2与function_s中的func2变为了不同的对象


# 装饰器
def my_decorator(func) -> Callable[[], None]:
    def wrapper() -> None:
        print("使用了装饰器")
        func()
    return wrapper

@my_decorator# @装饰器+func的定义->语法糖，等价于先定义func，然后func = my_decorator(func)
def my_func() -> None:
    print("这是一个基础函数")

my_func()# 使用了装饰器/n这是一个基础函数


